#!/bin/sh

die () { echo "$@" ; exit 1; }

\. ../../../nvm.sh

set -e

ESC="$(printf '\033')"
# The legend's letters are wrapped in color codes when the terminal supports
# them, so every text assertion below compares against the output with any
# escapes removed. That keeps these checks about structure and alignment only.
strip_colors() { command sed "s/${ESC}\[[0-9;]*m//g"; }

# Exact whole-line match against an already-captured string. Deliberately
# pipe-free: `grep -q` exits at its first match and hands SIGPIPE to whatever
# feeds it, which BSD sed swallows but GNU sed reports as "couldn't flush
# stdout", polluting the test's stderr.
contains_line () {
  case "
${2}
" in
    *"
${1}
"*) return 0 ;;
  esac
  return 1
}

# This test file is itself an executable named `nvm_print_color_legend`, so a
# plain `command -v` keeps finding it long after the function is gone. Emptying
# `PATH` for the lookup is the only reliable way to ask about the function
# alone: filtering on a `/` is not enough, because dash and zsh report a bare
# name for a current-directory match reached through an empty `PATH` component.
is_function () {
  [ -n "$(PATH=/nonexistent command -v "${1}" 2>/dev/null)" ]
}

is_function nvm_print_color_legend \
  || die 'nvm_print_color_legend is not defined'

OUTPUT="$(nvm_print_color_legend)"

LINES="$(nvm_echo "${OUTPUT}" | command wc -l | command tr -d ' ')"
[ "${LINES}" = 11 ] || die "expected 11 legend lines, got ${LINES}: ${OUTPUT}"

PLAIN="$(nvm_echo "${OUTPUT}" | strip_colors)"

# the two labels are literal, and their indentation lines the legend up under
# the `nvm set-colors` entry in the help output
contains_line '                                               Initial colors are:' "${PLAIN}" \
  || die "the 'Initial colors are:' label is missing or misaligned: ${PLAIN}"
contains_line '                                               Color codes:' "${PLAIN}" \
  || die "the 'Color codes:' label is missing or misaligned: ${PLAIN}"

# the default-palette sample, indented one level deeper than its label
contains_line '                                                  bygre' "${PLAIN}" \
  || die "the initial-colors sample is missing or misaligned: ${PLAIN}"

# all eight rows of the code table, in order, each with both letter forms
for ROW in \
  'r/R = red / bold red' \
  'g/G = green / bold green' \
  'b/B = blue / bold blue' \
  'c/C = cyan / bold cyan' \
  'm/M = magenta / bold magenta' \
  'y/Y = yellow / bold yellow' \
  'k/K = black / bold black' \
  'e/W = light grey / white' \
; do
  contains_line "                                                ${ROW}" "${PLAIN}" \
    || die "color code row '${ROW}' is missing or misaligned: ${PLAIN}"
done

# the extracted function has to stay wired into the help output
HELP_PLAIN="$(nvm --help | strip_colors)"
contains_line '                                               Color codes:' "${HELP_PLAIN}" \
  || die 'nvm --help no longer includes the color legend'

# And `nvm unload` has to clean it up, the way it does its sibling helpers.
# `set +e` inside the subshell so a non-zero `nvm unload` cannot abort it before
# the lookup runs; its status is reported separately, so "unload failed" can
# never be misreported as "the function survived".
UNLOAD_OUT="$(
  set +e
  nvm unload >/dev/null 2>&1
  # plain `echo`: `nvm unload` has just unset `nvm_echo`
  echo "unload_rc=$?"
  if is_function nvm_print_color_legend; then
    echo present
  else
    echo gone
  fi
)"
case "${UNLOAD_OUT}" in
  *gone*) : ;;
  *) die "nvm unload did not remove nvm_print_color_legend (${UNLOAD_OUT})" ;;
esac

echo "nvm_print_color_legend: passed"
